package com.prj.ufdm.cloud.ms.auth.api;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.prj.ufdm.cloud.base.dto.RetData;
import com.prj.ufdm.cloud.base.exception.BaseException;
import com.prj.ufdm.cloud.base.util.BaseStringUtil;
import com.prj.ufdm.cloud.base.util.BaseUuidUtil;
import com.prj.ufdm.cloud.ms.auth.bpo.SysUserBPO;
import com.prj.ufdm.cloud.ms.auth.bpo._impl.SysRoleBPOImpl;
import com.prj.ufdm.cloud.ms.auth.enums.AuthRetCodeEnum;
import com.prj.ufdm.cloud.ms.auth.model.SysRole;
import com.prj.ufdm.cloud.ms.auth.model.SysUser;
import com.prj.ufdm.cloud.ms.core.bpo.SeqNumBPO;
import com.prj.ufdm.cloud.ms.core.enums.CodeGenerateEnum;
import com.prj.ufdm.cloud.ms.core.model.PageBean;
import com.prj.ufdm.cloud.ms.core.model.SeqNum;

/**
 * 系统角色控制类
 * @author 胡义振  
 * @date 2018年3月26日
 */
@RequestMapping(value = "/api/auth/sysrole")
@Controller
public class SysRoleController {
	
	@Autowired
	private SysRoleBPOImpl sysRoleBPO;
	
	@Autowired
	private SysUserBPO sysUserBPO;
	
	@Autowired
	private SeqNumBPO seqNumBPO;
	
	/**
	 * 查询所有系统角色
	 * @param roleType 角色类型 （为空 查询所有）
	 * @return
	 * @author 胡义振  
	 * @date 2019年8月30日
	 */
	@RequestMapping(value = "/doGetList")
	@ResponseBody
	public RetData<PageInfo<SysRole>> doGetList(PageBean pageBean,SysRole sysRole) throws Exception {
		RetData<PageInfo<SysRole>> retData = new RetData<PageInfo<SysRole>>();
		PageHelper.startPage(pageBean.getPageNum(),pageBean.getPageSize());		
		List<SysRole>  list = sysRoleBPO.doGetList(sysRole);
		PageInfo<SysRole> page=new PageInfo<SysRole>(list);
		retData.setRetBody(page);
		return retData;
	}
	
	
	/**
	 * 查询所有系统角色(包含角色用户)
	 * @param roleType 角色类型 （为空 查询所有）
	 * @return
	 * @author 胡义振  
	 * @date 2019年8月30日
	 */
	@RequestMapping(value = "/doGetListWithUser")
	@ResponseBody
	public RetData<PageInfo<SysRole>> doGetListWithUser(PageBean pageBean,SysRole sysRole) throws Exception {
		RetData<PageInfo<SysRole>> retData = new RetData<PageInfo<SysRole>>();
		PageHelper.startPage(pageBean.getPageNum(),pageBean.getPageSize());
		List<SysRole>  list = sysRoleBPO.doGetList(sysRole);
		if(list!=null) {
			list.forEach(s -> {
				SysUser sysUser = new SysUser();
				sysUser.setRoleId(s.getId());
				try {
					s.setSysUserList(sysUserBPO.doGetSysUserListWithRoleId(sysUser));
				} catch (Exception e) {
					e.printStackTrace();
				}
			});
		}
		PageInfo<SysRole> page=new PageInfo<SysRole>(list);
		retData.setRetBody(page);
		return retData;
	}
	
	/**
	 * 查询用户角色
	 * @param userId 用户ID
	 * @return
	 * @author 胡义振  
	 * @date 2018年3月26日
	 */
	@RequestMapping(value = "/doGetListByUserId")
	@ResponseBody
	public RetData<List<SysRole>> doGetListByUserId(String userId) throws Exception {
		RetData<List<SysRole>> retData = new RetData<List<SysRole>>();
		// 用户ID不能为空
		if("".equals(BaseStringUtil.replaceAllBlank(userId))) {
			throw new BaseException(AuthRetCodeEnum.RET_CODE_0102004.getCode(),AuthRetCodeEnum.RET_CODE_0102004.getMessage());
		}
		retData.setRetBody(sysRoleBPO.doGetSysRoleListByUserId(userId));
		return retData;
	}
	
	/**
	 * 保存系统角色
	 * @return
	 * @author 胡义振  
	 * @date 2018年3月26日
	 */
	@RequestMapping(value = "/doSaveRole")
	@ResponseBody
	public RetData<String> doSaveRole(SysRole sysRole) throws Exception {
		RetData<String> retData = new RetData<String>();
		// 角色名不能为空
		if (sysRole == null || "".equals(BaseStringUtil.replaceAllBlank(sysRole.getRoleName()))) {
			throw new BaseException(AuthRetCodeEnum.RET_CODE_0103006.getCode(),
					AuthRetCodeEnum.RET_CODE_0103006.getMessage());
		}
		// 角色名已存在
		if (sysRoleBPO.doCheckSysRoleNameExist(sysRole.getRoleName(), "")) {
			throw new BaseException(AuthRetCodeEnum.RET_CODE_0103007.getCode(),
					AuthRetCodeEnum.RET_CODE_0103007.getMessage());
		}
		 //生成编码
		SeqNum seqNum=new SeqNum();
		seqNum.setCodeType(CodeGenerateEnum.ROLE_CODE_GENERATE.getMessage());
        String roleCode=seqNumBPO.generateCode(seqNum);
        if(StringUtils.isBlank(roleCode)) {
        	throw new BaseException("角色编码生成失败，联系管理员！");
        }
        sysRole.setRoleCode(roleCode);
		sysRole.setId(BaseUuidUtil.getUUID());		
		sysRoleBPO.doSave(sysRole);
		return retData;
	}
	
	/**
	 * 修改系统角色
	 * @return
	 * @author 胡义振  
	 * @date 2018年3月26日
	 */
	@RequestMapping(value = "/doModRole")
	@ResponseBody
	public RetData<String> doModRole(SysRole sysRole) throws Exception {
		RetData<String> retData = new RetData<String>();
		sysRoleBPO.doModById(sysRole);
		return retData;
	}
	
	/**
	 * 删除系统角色
	 * @param id 要删除的角色ID（多个ID，逗号分隔）
	 * @return
	 * @author 胡义振  
	 * @date 2018年3月26日
	 */
	@RequestMapping(value = "/doDelRole")
	@ResponseBody
	public RetData<String> doDelRole(String id) throws Exception {
		RetData<String> retData = new RetData<String>();
		// 保存日志
		SysRole sysRole = sysRoleBPO.doGetById(id);
		if (sysRole != null) {
			sysRoleBPO.doRmSysRoleById(id);
		}
		return retData;
	}
	
	
	/**
	 * 添加角色的功能
	 * @param 
	 *      roleId      角色ID
	 *      functionId  功能ID（多个用","号分隔）
	 * @return
	 * @author 胡义振  
	 * @date 2018年3月26日
	 */
	@RequestMapping(value = "/doAddRoleFunction")
	@ResponseBody
	public RetData<String> doAddRoleFunction(String roleId,String functionIds) throws Exception {
		RetData<String> retData = new RetData<String>();
		// 角色ID不能为空
		if("".equals(BaseStringUtil.replaceAllBlank(roleId))) {
			throw new BaseException(AuthRetCodeEnum.RET_CODE_0103001.getCode(),AuthRetCodeEnum.RET_CODE_0103001.getMessage());
		}
		// 功能ID不能为空
		if("".equals(BaseStringUtil.replaceAllBlank(functionIds))) {
			throw new BaseException(AuthRetCodeEnum.RET_CODE_0103002.getCode(),AuthRetCodeEnum.RET_CODE_0103002.getMessage());
		}
		sysRoleBPO.doAddRoleFunction(roleId,functionIds);
		return retData;
	}
	
	/**
	 * 添加角色的用户
	 * @param 
	 *      roleId      角色ID
	 *      userIds     用户ID（多个用","号分隔）
	 * @return
	 * @author 胡义振  
	 * @date 2018年3月26日
	 */
	@RequestMapping(value = "/doAddRoleUser")
	@ResponseBody
	public RetData<String> doAddRoleUser(String roleId,String userIds) throws Exception {
		RetData<String> retData = new RetData<String>();
		// 角色ID不能为空
		if("".equals(BaseStringUtil.replaceAllBlank(roleId))) {
			throw new BaseException(AuthRetCodeEnum.RET_CODE_0103001.getCode(),AuthRetCodeEnum.RET_CODE_0103001.getMessage());
		}
		// 用户ID不能为空
		if("".equals(BaseStringUtil.replaceAllBlank(userIds))) {
			throw new BaseException(AuthRetCodeEnum.RET_CODE_0102004.getCode(),AuthRetCodeEnum.RET_CODE_0102004.getMessage());
		}
		sysRoleBPO.doAddRoleSysUser(roleId,userIds);
		return retData;
	}
	
	/**
	 * 删除角色中的用户
	 * @param 
	 *      roleId      角色ID
	 *      userIds     用户ID（多个用","号分隔）
	 * @return
	 * @author 胡义振  
	 * @date 2018年3月26日
	 */
	@RequestMapping(value = "/doDelRoleUser")
	@ResponseBody
	public RetData<String> doDelRoleUser(String roleId,String userIds) throws Exception {
		RetData<String> retData = new RetData<String>();
		// 角色ID不能为空
		if("".equals(BaseStringUtil.replaceAllBlank(roleId))) {
			throw new BaseException(AuthRetCodeEnum.RET_CODE_0103001.getCode(),AuthRetCodeEnum.RET_CODE_0103001.getMessage());
		}
		// 用户ID不能为空
		if("".equals(BaseStringUtil.replaceAllBlank(userIds))) {
			throw new BaseException(AuthRetCodeEnum.RET_CODE_0102004.getCode(),AuthRetCodeEnum.RET_CODE_0102004.getMessage());
		}
		sysRoleBPO.doRmRoleUser(roleId,userIds);
		return retData;
	}
	
}
